package datasource

import (
	"crawler/conf"
	"fmt"
	"github.com/gomodule/redigo/redis"
	"log"
	"sync"
	"time"
)

var cacheInstance *redis.Pool
var rdsLock sync.Mutex

// 得到唯一的redis缓存实例
func InstanceCache() *redis.Pool {
	if cacheInstance != nil {
		return cacheInstance
	}

	rdsLock.Lock()
	defer rdsLock.Unlock()

	if cacheInstance != nil {
		return cacheInstance
	}
	return NewCache()
}

func NewCache() *redis.Pool {
	// 构建连接池
	pool := &redis.Pool{
		Dial: func() (conn redis.Conn, e error) {
			c, err := redis.Dial("tcp", fmt.Sprintf(
				"%s:%d",
				conf.RdsCache.Host,
				conf.RdsCache.Port))
			if err != nil {
				log.Fatal("dataSource.redis.NewCache dial error=", err)
				return nil, err
			}
			return c, nil
		},
		TestOnBorrow: func(c redis.Conn, t time.Time) error {
			if time.Since(t) < time.Minute {
				return nil
			}
			_, err := c.Do("PING")
			return err
		},
		MaxIdle:         100, // 最大连接数
		MaxActive:       100, // 最大活跃数
		IdleTimeout:     0,   //超时时间，0表示空闲连接不关闭
		Wait:            false,
		MaxConnLifetime: 0, // 连接活跃时间，0表示连接不关闭
	}

	cacheInstance = pool
	return cacheInstance
}
